package controller;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

import model.Carta;
import model.Jogador;

public class Regras {
	
	private boolean funcionando = true;
	private ArrayList<Jogador> jogadores;
	private Jogador jogadorDaVez;
	private Jogador oponente;
	private Carta cartaOponente; //A carta pode ser removida ao fazer a compara��o, e � esta carta que precisa ser enviada;
	
	public Regras () {
		this.jogadores = new ArrayList<Jogador>();		
	}
	
	private void carregarJogo() {
		
		ArrayList<Carta> lista = this.lerArquivo();
		Collections.shuffle(lista);
		
		if(lista.size()!=30) {
			System.err.println("Classe Regras: erro no arquivo");
			funcionando = false;
			return;
		}
		
		for(int i=0; i<lista.size(); i++){
			if(i<(lista.size()/2)) {
				jogadores.get(0).addCarta(lista.get(i));
			} else {
				jogadores.get(1).addCarta(lista.get(i));
			}
		}
		
		Collections.shuffle(jogadores);
		jogadorDaVez = jogadores.get(0);
		oponente = jogadores.get(1);
		
		cartaOponente = oponente.getCarta();
	}
	
	public void addJogador(Jogador jogador) {
		if(jogadores.size() < 2) jogadores.add(jogador);		
		if(jogadores.size() == 2) this.carregarJogo();
	}
	
	public boolean isPronto() {
		if(jogadores.size() == 2) return true;
		return false;
	}
	
	public boolean isMinhaVez(Jogador jogador) {
		if(jogadorDaVez != null && jogadorDaVez.equals(jogador)) return true;
		return false;
	}
	
	public boolean isFuncionando() {
		return funcionando;
	}

	public void setFuncionando(boolean funcionando) {
		this.funcionando = funcionando;
	}
	
	public Carta getCartaOponente(){
		return cartaOponente;
	}
	
	public Carta getCartaJogadorDaVez() {
		return jogadorDaVez.getCarta();
	}
	
	public boolean isVencedor(Jogador jogador) {
		if(jogador.getDeckSize()>=30) return true;
		else return false;
	}
	
	public boolean isPerdedor(Jogador jogador) {
		if(jogador.getDeckSize()<=0) return true;
		else return false;
	}
	
	public Jogador getOponente(Jogador jogador) {
		if(this.isMinhaVez(jogador)) return oponente;
		else return jogadorDaVez;
	}
	
	public String comparar(String att) {
		
		if(oponente == null || jogadorDaVez == null) {
			System.err.println("Classe Regras: jogadores n�o encontrados!");
			funcionando = false;
			return "erro";
		}
		
		cartaOponente = oponente.getCarta();
		Carta carta = jogadorDaVez.getCarta();
		
		int attValueOponente = 0;
		int attValue = 0;
		
		if(att.equalsIgnoreCase("forca")) {
			attValueOponente = cartaOponente.getForca();
			attValue = carta.getForca();
		} else if (att.equalsIgnoreCase("velocidade")) {
			attValueOponente = cartaOponente.getVelocidade();
			attValue = carta.getVelocidade();
		} else if (att.equalsIgnoreCase("habilidade")) {
			attValueOponente = cartaOponente.getHabilidade();
			attValue = carta.getHabilidade();
		} else if (att.equalsIgnoreCase("equipamento")) {
			attValueOponente = cartaOponente.getEquipamento();
			attValue = carta.getEquipamento();
		} else if (att.equalsIgnoreCase("inteligencia")) {
			attValueOponente = cartaOponente.getInteligencia();
			attValue = carta.getInteligencia();
		}
		
		if (attValue < attValueOponente) {
			oponente.addCarta(jogadorDaVez.removeCarta());
			Jogador temp = jogadorDaVez;
			jogadorDaVez = oponente;
			oponente = temp;
			return "perdeu";
		} else if (attValue == attValueOponente) {
			jogadorDaVez.sort();
			oponente.sort();
			return "empatou";
		} else {
			jogadorDaVez.addCarta(oponente.removeCarta());
			jogadorDaVez.sort();
			oponente.sort();
			return "venceu";
		}
	}
	
	private ArrayList<Carta> lerArquivo() {
		ArrayList<Carta> cartas = new ArrayList<Carta>();
		
		try {
			//Cria��o de um buffer para a ler de uma stream
//			BufferedReader strR = new BufferedReader(new FileReader(this.getClass().getResource("../arquivos/cartas.csv").getPath()));
			BufferedReader strR = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/arquivos/cartas.csv")));
			
			String str;
			String[] tableLine;

			//Essa estrutura do looping while � cl�ssica para ler cada linha
			//do arquivo 
			while((str = strR.readLine())!= null){
				//Aqui usamos o m�todo split que divide a linha lida em um array de String
				//passando como parametro o divisor ";".
				tableLine = str.split(";");
				
				String img = null;
				Integer[] atts = new Integer[5];
				
				try {
					for(int i=0; i<tableLine.length; i++){
						if(i == 0) {
							img = tableLine[i];
						} else {
							atts[i-1] = Integer.parseInt(tableLine[i]);						
						}
					}
					
					Carta carta = new Carta(img, atts[0], atts[1], atts[2], atts[3], atts[4]);
					cartas.add(carta);
				} catch (Exception e) {}
			}
			//Fechamos o buffer
			strR.close();			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return cartas;
	}	
}
